#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <mqueue.h>
#include <unistd.h>
#include <pthread.h>


static const char *mq_name = "/test_mq";//消息队列名字
static mqd_t mqd;//消息队列描述符

void *first_func(void *arg)
{
    printf("first线程(%d)开始执行\n", gettid());
    
    // 接收消息
    char data_buff[100];
    // receive是阻塞的，如果没有消息，就会一直等待直到有消息
    ssize_t size = mq_receive(mqd, data_buff, 100, NULL);
    if (size > 0)
    {
        printf("接收到的消息为：%s, size=%ld\n", data_buff, size);
    }
    else
    {
        printf("接收消息失败, size=%ld\n", size);
    }
    
}
void *second_func(void *arg)
{
    printf("second线程(%d)开始执行\n", gettid());
    sleep(1);
    // 发送消息
    char *msg = "atguigu";
    int result = mq_send(mqd, msg, strlen(msg) + 1, 1);
    if (result == -1)
    {
        printf("发送消息失败\n");
    }
    else
    {
        printf("发送消息成功\n");
    }
}
int main()
{
    //创建消息队列
    struct mq_attr attr;
    attr.mq_msgsize = 50;//消息大小
    attr.mq_maxmsg = 10;//消息队列中最大消息数
    mqd = mq_open(mq_name, O_RDWR | O_CREAT, 0644, &attr);
    if (mqd == (mqd_t)-1)
    {
        printf("mq_open error\n");
    }

    //创建线程
    pthread_t pt1, pt2;
    pthread_create(&pt1, NULL, first_func, NULL);
    pthread_create(&pt2, NULL, second_func, NULL);


    //等待线程结束
    pthread_join(pt1, NULL);
    pthread_join(pt2, NULL);
    //关闭消息队列
    mq_close(mqd);
    //删除消息队列
    mq_unlink(mq_name);
    printf("end\n");
    return 0;
}